using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

        public LogradouroVO getLogradouro(int? idLogradouro, string logradouro, int? idUf, int? idCidade, int? idBairro, int? idLogradouroTipo, string cEP)
		{
			LogradouroVO logradouroVO = null;
			List<LogradouroVO> listLogradouroVOs = getLogradouros(idLogradouro, logradouro, idUf, idCidade, idBairro, idLogradouroTipo, cEP);
			if (listLogradouroVOs != null && listLogradouroVOs.Count > 0)
			{
				logradouroVO = listLogradouroVOs[0];
			}
			return logradouroVO;
		}

        public LogradouroVO getLogradouro(int? idLogradouro, string logradouro, int? idBairro, int? idLogradouroTipo, string cEP)
		{
            return getLogradouro(idLogradouro, logradouro, null, null, idBairro, idLogradouroTipo, cEP);
        }

        public LogradouroVO getLogradouro(int? idLogradouro, string logradouro)
        {
            return getLogradouro(idLogradouro, logradouro, null, null, null);
        }

		public LogradouroVO getLogradouro(int? idLogradouro)
		{
			return getLogradouro(idLogradouro, null);
		}

		public List<LogradouroVO> getLogradouros()
		{
			return getLogradouros(null, null, null, null, null);
		}

		public List<LogradouroVO> getLogradouros(int? idLogradouro)
		{
			return getLogradouros(idLogradouro, null, null, null, null);
		}

		public List<LogradouroVO> getLogradouros(int? idLogradouro, string logradouro)
		{
			return getLogradouros(idLogradouro, logradouro, null, null, null);
		}

        public List<LogradouroVO> getLogradouros(int? idLogradouro, string logradouro, int? idBairro, int? idLogradouroTipo, string cEP)
        {
            return getLogradouros(idLogradouro, logradouro, null, null, idBairro, idLogradouroTipo, cEP);
        }

        public List<LogradouroVO> getLogradouros(int? idLogradouro, string logradouro, int? idUf, int? idCidade, int? idBairro, int? idLogradouroTipo, string cEP)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT logr.idLogradouro as logr_idLogradouro, logr.idBairro as logr_idBairro, logr.cEP as logr_cEP, logr.idLogradouroTipo as logr_idLogradouroTipo, lgt.logradouroSigla as lgt_logradouroSigla, logr.logradouro as logr_logradouro, cid.idCidade as cid_idCidade, cid.cidade as cid_cidade, uf.idUf as uf_idUf, uf.sigla as uf_sigla,  logr.Cadastro as logr_Cadastro, logr.CadastradoPor as logr_CadastradoPor, logr.Edicao as logr_Edicao, logr.EditadoPor as logr_EditadoPor  ");
            query.AppendLine("FROM logradouro as logr ");
            query.AppendLine("  LEFT OUTER JOIN bairro as bai on logr.idBairro=bai.idBairro  LEFT OUTER JOIN logradourotipo as lgt on logr.idLogradouroTipo=lgt.idlogradouroTipo  ");
            query.AppendLine("          LEFT OUTER JOIN cidade as cid on cid.idCidade=bai.idCidade  ");
            query.AppendLine("              LEFT OUTER JOIN uf as uf on uf.idUf=cid.idUf  ");
            
            if (idLogradouro != null)
			{
				query.AppendLine(where + "logr.idLogradouro=@idLogradouro ");
				where = "AND ";
			}
            if (idUf != null)
            {
                query.AppendLine(where + "uf.idUf=@idUf ");
                where = "AND ";
            }
            if (idCidade != null)
            {
                query.AppendLine(where + "cid.idCidade=@idCidade ");
                where = "AND ";
            }
			if (idBairro != null)
			{
				query.AppendLine(where + "logr.idBairro=@idBairro ");
				where = "AND ";
			}
			if (!String.IsNullOrEmpty(cEP))
			{
				query.AppendLine(where + "logr.cEP=@cEP ");
				where = "AND ";
			}
			if (idLogradouroTipo != null)
			{
				query.AppendLine(where + "logr.idLogradouroTipo=@idLogradouroTipo ");
				where = "AND ";
			}
			if (logradouro != null)
			{
				query.AppendLine(where + "logr.logradouro LIKE @logradouro ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY logr.logradouro ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idLogradouro!= null) cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", idLogradouro));
            if (idUf != null) cmd.Parameters.Add(getParameter(cmd, "@idUf", idUf));
            if (idCidade != null) cmd.Parameters.Add(getParameter(cmd, "@idCidade", idCidade));
            if (idBairro!= null) cmd.Parameters.Add(getParameter(cmd, "@idBairro", idBairro));
			if (cEP!= null) cmd.Parameters.Add(getParameter(cmd, "@cEP", cEP));
			if (idLogradouroTipo!= null) cmd.Parameters.Add(getParameter(cmd, "@idLogradouroTipo", idLogradouroTipo));
			if (logradouro!= null) cmd.Parameters.Add(getParameter(cmd, "@logradouro", "%"+logradouro+"%"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<LogradouroVO> listLogradouro = new List<LogradouroVO>();

				while (reader.Read())
				{
					LogradouroVO logradouroVO = LogradouroVO.CreateVO();
					logradouroVO.idLogradouro = reader.GetInt32(reader.GetOrdinal("logr_idLogradouro"));

                    logradouroVO.uf = reader.GetString(reader.GetOrdinal("uf_sigla"));
                    logradouroVO.cidade = reader.GetString(reader.GetOrdinal("cid_cidade"));

					logradouroVO.idBairro = reader.GetInt32(reader.GetOrdinal("logr_idBairro"));
                    logradouroVO.idBairroVO = new SgiDAOT().getBairro(logradouroVO.idBairro);


					logradouroVO.cEP = reader.GetString(reader.GetOrdinal("logr_cEP"));
					logradouroVO.idLogradouroTipo = reader.GetInt32(reader.GetOrdinal("logr_idLogradouroTipo"));
					if (!reader.IsDBNull(reader.GetOrdinal("lgt_logradouroSigla")))
						logradouroVO.idLogradouroTipoVO.logradouroSigla = reader.GetString(reader.GetOrdinal("lgt_logradouroSigla"));
					logradouroVO.logradouro = reader.GetString(reader.GetOrdinal("logr_logradouro"));
					logradouroVO.cadastro = reader.GetDateTime(reader.GetOrdinal("logr_Cadastro"));
					logradouroVO.cadastradoPor = reader.GetString(reader.GetOrdinal("logr_CadastradoPor"));
					logradouroVO.edicao = reader.GetDateTime(reader.GetOrdinal("logr_Edicao"));
					logradouroVO.editadoPor = reader.GetString(reader.GetOrdinal("logr_EditadoPor"));


					listLogradouro.Add(logradouroVO);
				}
				reader.Close();
				return listLogradouro;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setLogradouro(LogradouroVO logradouroVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE logradouro ");
			query.AppendLine("SET idBairro=@idBairro, cEP=@cEP, idLogradouroTipo=@idLogradouroTipo, logradouro=@logradouro,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idLogradouro=@idLogradouro ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", logradouroVO.idLogradouro));
			cmd.Parameters.Add(getParameter(cmd, "@idBairro", logradouroVO.idBairro));
			cmd.Parameters.Add(getParameter(cmd, "@cEP", logradouroVO.cEP));
			cmd.Parameters.Add(getParameter(cmd, "@idLogradouroTipo", logradouroVO.idLogradouroTipo));
			cmd.Parameters.Add(getParameter(cmd, "@logradouro", logradouroVO.logradouro));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", logradouroVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", logradouroVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", logradouroVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", logradouroVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newLogradouro(LogradouroVO logradouroVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO logradouro ");
			query.AppendLine("  ( idBairro, cEP, idLogradouroTipo, logradouro, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @idBairro, @cEP, @idLogradouroTipo, @logradouro, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idBairro", logradouroVO.idBairro));
			cmd.Parameters.Add(getParameter(cmd, "@cEP", logradouroVO.cEP));
			cmd.Parameters.Add(getParameter(cmd, "@idLogradouroTipo", logradouroVO.idLogradouroTipo));
			cmd.Parameters.Add(getParameter(cmd, "@logradouro", logradouroVO.logradouro));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", logradouroVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", logradouroVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", logradouroVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", logradouroVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('logradouro') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delLogradouro(LogradouroVO logradouroVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM logradouro ");
			query.AppendLine("WHERE idLogradouro=@idLogradouro ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", logradouroVO.idLogradouro));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountLogradouroxIdBairro(int? idBairro)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idBairro) as ocorrencias FROM logradouro WHERE IdBairro=@IdBairro ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdBairro", idBairro));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountLogradouroxIdLogradouroTipo(int? idLogradouroTipo)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idLogradouroTipo) as ocorrencias FROM logradouro WHERE IdLogradouroTipo=@IdLogradouroTipo ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdLogradouroTipo", idLogradouroTipo));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
